#include <cstdio>
#include <systemc.h>

// [定义模块]
SC_MODULE(HalfAdder) {
    // [声明端口]
    sc_in<bool>     a;
    sc_in<bool>     b;
    sc_out<bool>    s;
    sc_out<bool>    c;

    // [逻辑处理函数]
    void process_logic() {
        s.write(a.read() ^ b.read());
        c.write(a.read() & b.read());
    }

    // [构造函数]
    SC_CTOR(HalfAdder) {
        // [注册进程]: 注册 process_logic 为一个 SC_METHOD 进程
        SC_METHOD(process_logic);
        // [定义敏感列表]: 当输入 a 或 b 变化时, 执行 process_logic
        sensitive << a << b;
    }
};

int  sc_main(int argc, char* argv[]) {
    // [声明信号]: 用于连接模块端口
    sc_signal<bool> a, b, s, c;

    // [实例化模块]
    HalfAdder half_adder("half_adder");

    // [绑定端口]: 将信号连接到模块的端口
    half_adder.a(a);
    half_adder.b(b);
    half_adder.s(s);
    half_adder.c(c);

    // [追踪波形]
    sc_trace_file *tf = sc_create_vcd_trace_file("half_adder");
    sc_trace(tf, a, "a");
    sc_trace(tf, b, "b");
    sc_trace(tf, s, "s");
    sc_trace(tf, c, "c");
    tf->set_time_unit(1, SC_NS); // 设置时间单位为 1 ns

    // [施加激励]
    printf("a b s c | @time\n");
    printf("--------|------\n");
    bool as[] = {0, 1, 0, 1};
    bool bs[] = {0, 0, 1, 1};
    for (int i = 0; i < 4; i++) {
        a.write(as[i]);
        b.write(bs[i]);
        sc_start(10, SC_NS); // 时间步进 10 ns
        printf("%d %d %d %d | %s\n", a.read(), b.read(), s.read(), c.read(), sc_time_stamp().to_string().c_str());
    }

    // [关闭波形文件]
    sc_close_vcd_trace_file(tf);

    return 0;
}
